// 加载Express模块
const express = require("express");
const bodyParser = require("body-parser");
// 加载CORS模块
const cors = require("cors");

// 导入路由
const proRouter = require("./api/pro");
const faceRouter = require("./api/automate");
const phoneRouter = require("./api/faceadd");
const recordRouter = require('./api/rex');
//const hotelRouter = require("./api/hotel");

// 生成token
const jwt = require("./jwt");

// socket里面的规则必须还是要引入
const { createServer } = require("http");
// websocket引入,将服务挂载到app服务中，提供长连接服务，这边在官方文里面只需要结果出一个server使用即可
const { Server } = require("socket.io");
// 创建服务器对象
const app = express();
// 这个是因为socket规定需要
const httpServer = createServer(app);
// 创建websocket实对象，并设置跨域
const socketio = new Server(httpServer, {
  cors: {
    origin: "*",
    methods: ["GET", "POST"],
  },
});

// console.log(socketio);
// 一旦客户端建立连接成功，将会触发connection事件
// 进而执行回调方法，传入socket对象与这个客户端进行交互
socketio.on("connection", (socket) => {
  // socket代表连接建立成功后的套接字对象
  // 我们可以通过socket对象与当前连接的客户端进行数据交互
  // socket.emit("textmsg",'1212')
  console.log("有客户端进来了");
  socket.on("text",(data)=>{ 
    console.log(data);
    switch (data) {
      case 1: socket.emit("text","11"); break;
      case 2: socket.emit("text","22"); break;
      case 3: socket.emit("text","33"); break;
      case 4: socket.emit("text","44"); break;
      case 5: socket.emit("text","55"); break;
      default:socket.emit("text","101");break;
    }
  })
  // socket.on("socket", (data) => {
    // if (data == '你好') {
    //   socket.emit('msg1','主人有什么吩咐')
    // }else {
    //   socket.emit('msg1','我听不懂主人在说什么')
    // }
    // console.log(data);
    // 当我服务器监听到有人发送了数据，我们就将这个数据拿到后，发送给所有人，发送所有的代码就是必须使用的是socketio发送emit；而不是使用socket来发送给一个人。
    // socketio.emit("msgall", data);
  //   socket.on("text",(data)=>{
  //     console.log(data)
  //     if(data==1){
  //       socket.emit("text","11")
  //     }else if(data==2){
  //       socket.emit("text","22")
  //     }else if(data == 3){
  //       socket.emit("text","33")
  //     }else if(data == 4){
  //       socket.emit("text","44")
  //     }else if(data == 5){
  //       socket.emit("text","55")
  //     }else if(data == 6){
  //       socket.emit("text","66")
  //     }else if(data == 7){
  //       socket.emit("text","77")
  //     }else if(data == 8){
  //       socket.emit("text","88")
  //     }else if(data == 9){
  //       socket.emit("text","99")
  //     }else{
  //       socket.emit("text","101")
  //     }
  //   // })
    
  // });
});

// 指定服务器对象监听的端口号
httpServer.listen(3000, () => {
  console.log("服务器启动");
});

// 托管静态资源
app.use(express.static("./public"));
// 因为node后端默认只能接受100kb，将其扩大下，base64需要传递
app.use(bodyParser.json({ limit: "100mb" }));
app.use(bodyParser.urlencoded({ limit: "100mb", extended: true }));
// 对body中数据进行解析，需放在路由中间件之前
app.use(
  express.urlencoded({
    extended: true,
  })
);

// 使用CORS中间件(后期不用，使用前端http代理解决跨域问题)
app.use(
  cors({
    origin: [
      "http://localhost:8080",
      "http://127.0.0.1:8080",
      "http://localhost:5500",
      "http://127.0.0.1:5500",
    ],
  })
);

// token 判断
app.use((req, res, next) => {
  console.log(req.headers.authorization);
  console.log(req.url);
  console.log(req.url != '/login');
  if (
     req.url !="/face" && req.url != '/login' && req.url != '/register' && req.url !='/addface' && req.url != '/seachface' && req.url != '/logonface' && req.url != '/faceactive' && req.url != '/loginphone/code' && req.url != '/loginphone' && req.url != '/record'  && req.url != '/reg1' && req.url != '/reg2'
  ) {
    console.log(2222);
    let token = req.headers.authorization;
    let result = jwt.verifyToken(token);
    // 如果考验通过就next，否则就返回登陆信息不正确
    if (result === undefined) {
      res.send({ status: 403, msg: "未提供证书" });
    } else if (result.name == "TokenExpiredError") {
      res.send({ status: 403, msg: "登录超时，请重新登录" });
    } else if (result.name == "JsonWebTokenError") {
      res.send({ status: 403, msg: "证书出错" });
    } else {
      console.log(11);
      req.user = result;
      next();
    }
  } else {
    console.log(1111);
    next();
  }
});

// 路由中间件
app.use("", proRouter);
app.use("", faceRouter);
app.use("", phoneRouter);
app.use('',recordRouter);
//app.use("",hotelRouter)

// 错误处理中间件，需放在路由中间件之后
app.use(function (err, req, res, next) {
  console.log(err);
  res.status(500).send({ code: 500, msg: "服务端错误" });
});
